package cn.iocoder.yudao.framework.pay.core.client.impl.huifu;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
import lombok.Data;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.Validator;
import javax.validation.constraints.NotBlank;
import java.util.Set;

/**
 * 汇付的支付配置类
 */
@Data
public class HuifuWxPayClientConfig implements PayClientConfig {
    /**
     * 小程序或公众号的 appid
     */
    @NotBlank(message = "APPID 不能为空")
    private String appId;
    /**
     * 汇付分配的商户号
     */
    @NotBlank(message = "商户号 huifuId 不能为空")
    private String huifuId;

    /**
     * 汇付平台分配的产品号
     */
    @NotBlank(message = "产品号 productId 不能为空")
    private String productId;

    /**
     * 汇付平台分配的系统号
     */
    @NotBlank(message = "系统号 sysId 不能为空")
    private String sysId;

    /**
     * 汇付分配的私钥，用于签名
     */
    @NotBlank(message = "RSA 私钥不能为空")
    private String rsaPrivateKey;

    /**
     * 汇付公钥，用于验签
     */
    @NotBlank(message = "RSA 公钥不能为空")
    private String rsaPublicKey;
    @Override
    public void validate(Validator validator) {
        // 使用 JSR 380（javax.validation）标准的 Validator 对当前对象进行校验
        // 返回所有违反约束的字段集合（包含字段名、错误信息等）
        Set<ConstraintViolation<HuifuWxPayClientConfig>> validate = validator.validate(this);
        // 使用 Hutool 的工具类 CollUtil 判断校验结果集合是否不为空
        // 如果不为空，说明存在至少一个字段不符合校验规则
        if (CollUtil.isNotEmpty(validate)) {
            // 抛出 javax.validation 提供的 ConstraintViolationException 异常
            // 该异常包含了所有的字段校验错误信息
            // 通常框架会将这个异常转换为标准的 HTTP 400 错误响应（如果配置了异常处理器）
            throw new ConstraintViolationException(validate);
        }
    }
}
